package ballena.activities;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.StreamCorruptedException;

import ballena.utiles.Global;
import ballena.utiles.Servlet;
import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class Galeria extends Activity {

	private Gallery gallery;
	private ImageView imgView;

	// Array con las rutas
	private String[] rutas;
	// Array con las miniaturas
	private byte[][] imagenesMin;
	// Array con las imagenes (se ira cargando dinamicamente)
	private byte[][] imagenes;
	
	// Identificación del usuario cuyas fotos son vistas
	private int id;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.galeria);

		// Obtengo la id del usuario del que quiero ver las fotos
		Bundle bundle = getIntent().getExtras();
		id = bundle.getInt("id");
		
		// Obtengo las rutas y las miniaturas
		this.obtenerImagenesMin();

		if (!rutas[0].equals(Global.IMAGEN_FALLO)) {
			// Inicializo el array de imagenes grandes
			this.imagenes = new byte[imagenesMin.length][];

			// Problema si no hay imagenes!!!!
			imagenes[0] = obtenerImagen(0);
			Bitmap img = BitmapFactory.decodeByteArray(imagenes[0], 0,
					imagenes[0].length);

			imgView = (ImageView) findViewById(R.id.ImageView01);
			imgView.setImageBitmap(img);

			gallery = (Gallery) findViewById(R.id.examplegallery);
			gallery.setAdapter(new AddImgAdp(this));

			gallery.setOnItemClickListener(new OnItemClickListener() {
				public void onItemClick(AdapterView parent, View v,
						int position, long id) {
					// Si no la tenemos en la memoria del movil
					if (imagenes == null || imagenes[position] == null) {
						// la pido al servlet y la agrego al array de imagnes
						// grandes
						imagenes[position] = obtenerImagen(position);
					}
					// Siempre la cargo desde dicho array
					imgView.setImageBitmap(BitmapFactory.decodeByteArray(
							imagenes[position], 0, imagenes[position].length));
				}
			});
		} else {
			finish();
		}
	}

	public class AddImgAdp extends BaseAdapter {
		int GalItemBg;
		private Context cont;

		public AddImgAdp(Context c) {
			cont = c;
			TypedArray typArray = obtainStyledAttributes(R.styleable.GalleryTheme);
			GalItemBg = typArray.getResourceId(
					R.styleable.GalleryTheme_android_galleryItemBackground, 0);
			typArray.recycle();
		}

		public int getCount() {
			return imagenesMin.length;
		}

		public Object getItem(int position) {
			return position;
		}

		public long getItemId(int position) {
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
			ImageView imgView = new ImageView(cont);

			imgView.setImageBitmap(BitmapFactory.decodeByteArray(
					imagenesMin[position], 0, imagenesMin[position].length));
			imgView.setLayoutParams(new Gallery.LayoutParams(120, 90));
			imgView.setScaleType(ImageView.ScaleType.FIT_XY);
			imgView.setBackgroundResource(GalItemBg);

			return imgView;
		}
	}

	private void obtenerImagenesMin() {
		// Ahora como pruba tengo el id del usuario actual, cambiarlo al que se
		// le pase por el intent
		String param[] = { "id=" + id,
				"accion=" + Global.IMAGENES_MIN_VER };
		// Importante hacer la llamada al servlet con la reescritura de URL para
		// que reconozca la sesion
		Servlet s = new Servlet(Global.SERVLET, param, Global.ID_SESION);
		s.conectar();

		ObjectInputStream in;

		try {
			in = new ObjectInputStream(s.getInputStream());
			// Obtengo las rutas de las imagenes
			rutas = (String[]) in.readObject();
			if (rutas[0].equals(Global.IMAGEN_FALLO)) {
				Toast.makeText(this.getApplicationContext(),
						"No existen imagenes que mostrar", 1000).show();
			} else {
				// Obtengo las imagenes en miniatura
				imagenesMin = (byte[][]) in.readObject();
			}

		} catch (StreamCorruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			s.desconectar();
		}
	}

	private byte[] obtenerImagen(int position) {
		byte[] imagen = null;
		// Ahora como pruba tengo el id del usuario actual, cambiarlo al que se
		// le pase por el intent
		String param[] = { "id=" + id, "pos=" + position,
				"accion=" + Global.IMAGENES_VER };
		Servlet s = new Servlet(Global.SERVLET, param, Global.ID_SESION);
		s.conectar();

		ObjectInputStream in;
		try {
			in = new ObjectInputStream(s.getInputStream());
			imagen = (byte[]) in.readObject();

		} catch (StreamCorruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			s.desconectar();
		}
		return imagen;
	}

}